class Solution {
    public int rob(int[] nums) {
        int n = nums.length;
        // 分两种情况讨论 - 偷 0   不偷 0
        return Math.max(nums[0] + rob1(nums, 2, n - 2), rob1(nums, 1, n - 1));
    }
    public int rob1(int[] nums, int left, int right){
        if(left > right) return 0;
        // 确定状态表示 - 偷/不偷这个格子，最大的钱数
        int n = nums.length;
        int[] f = new int[n];
        int[] g = new int[n];
        f[left] = nums[left];
        g[left] = 0;
        for(int i = left + 1; i <= right; i++){
            f[i] = g[i - 1] + nums[i];
            g[i] = Math.max(f[i - 1], g[i - 1]);
        }
        return Math.max(f[right], g[right]);
    }
}